#==========================================================================
#
#     Program: ParaView
#
#     Copyright (c) 2005-2008 Sandia Corporation, Kitware Inc.
#     All rights reserved.
#
#     ParaView is a free software; you can redistribute it and/or modify it
#     under the terms of the ParaView license version 1.2.
#
#     See License_v1.2.txt for the full ParaView license.
#     A copy of this license can be obtained by contacting
#     Kitware Inc.
#     28 Corporate Drive
#     Clifton Park, NY 12065
#     USA
#
#  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
#  ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
#  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
#  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR
#  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
#  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
#  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
#  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
#  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
#  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
#  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
#==========================================================================

# Needed to have the Python version numbers available in paraview-config.
set(extra_modules)
if (PARAVIEW_ENABLE_PYTHON)
  find_package(PythonInterp REQUIRED)
  set(extra_modules vtkUtilitiesPythonInitializer)
endif ()

file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/vtkModules.h"
"#include \"vtkModuleDependencies.h\"

struct vtkModuleDependency
{
  const char* ModuleName;
  const char** LibraryNames;
  const char** Depends;
  bool Python;
} vtkModules[] = {
")
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/vtkModuleDependencies.h"
"#include <cstdlib>

")
foreach (vtk_module IN LISTS VTK_MODULES_ENABLED extra_modules)
  if (NOT vtk_module STREQUAL last_module)
    set(has_python "false")
    if (TARGET ${vtk_module}PythonD)
      set(has_python "true")
    endif ()
    file(APPEND "${CMAKE_CURRENT_BINARY_DIR}/vtkModules.h"
"  { \"${vtk_module}\", ${vtk_module}Libraries, ${vtk_module}Depends, ${has_python} },
")

    file(APPEND "${CMAKE_CURRENT_BINARY_DIR}/vtkModuleDependencies.h"
"const char* ${vtk_module}Libraries[] = { ")
    foreach (vtk_module_library IN LISTS "${vtk_module}_LIBRARIES")
      if (vtk_module_library STREQUAL "optimized" OR
          vtk_module_library STREQUAL "debug")
        unset(vtk_module_library_name)
      elseif (vtk_module_library MATCHES "^-l")
        string(SUBSTRING "${vtk_module_library}" 2 -1 vtk_module_library)
        find_library(vtk_module_library_name "${vtk_module_library}")
      elseif (IS_ABSOLUTE "${vtk_module_library}")
        set(vtk_module_library_name "${vtk_module_library}")
      elseif (vtk_module_library)
        set(type)
        get_property(type TARGET "${vtk_module_library}" PROPERTY TYPE)
        if (type STREQUAL "INTERFACE_LIBRARY")
          # note, this may set vtk_module_library to empty for interface
          # libraries that have no INTERFACE_LINK_LIBRARIES.
          get_property(vtk_module_library TARGET "${vtk_module_library}" PROPERTY INTERFACE_LINK_LIBRARIES)
        endif ()
        set(vtk_module_library_name)
        if (vtk_module_library)
          get_property(vtk_module_library_name TARGET "${vtk_module_library}" PROPERTY OUTPUT_NAME)
        endif ()
        if (NOT vtk_module_library_name)
          set(vtk_module_library_name "${vtk_module_library}")
        endif ()
      endif ()
      if (vtk_module_library_name)
        file(APPEND "${CMAKE_CURRENT_BINARY_DIR}/vtkModuleDependencies.h"
"\"${vtk_module_library_name}\", ")
      endif ()
    endforeach ()

    if (TARGET ${vtk_module}_KIT)
      file(APPEND "${CMAKE_CURRENT_BINARY_DIR}/vtkModuleDependencies.h"
        "\"${${vtk_module}_KIT}\", ")
    elseif (TARGET ${vtk_module})
      get_property(target_type TARGET "${vtk_module}" PROPERTY TYPE)
      if (target_type MATCHES "_LIBRARY$")
        if (target_type STREQUAL "INTERFACE_LIBRARY")
          # note, this may set vtk_module_library to empty for interface
          # libraries that have no INTERFACE_LINK_LIBRARIES.
          get_property(vtk_module_library TARGET "${vtk_module}" PROPERTY INTERFACE_LINK_LIBRARIES)
        else ()
          set(vtk_module_library "${vtk_module}")
        endif ()
        set(vtk_module_library_name)
        if (vtk_module_library)
          get_property(vtk_module_library_name TARGET "${vtk_module_library}" PROPERTY OUTPUT_NAME)
        endif ()
        if (vtk_module_library_name)
          file(APPEND "${CMAKE_CURRENT_BINARY_DIR}/vtkModuleDependencies.h"
"\"${vtk_module_library_name}\", ")
        endif ()
      endif ()
    endif ()

    file(APPEND "${CMAKE_CURRENT_BINARY_DIR}/vtkModuleDependencies.h"
"NULL };
const char* ${vtk_module}Depends[] = { ")
    foreach (vtk_module_depends IN LISTS ${vtk_module}_DEPENDS)
      file(APPEND "${CMAKE_CURRENT_BINARY_DIR}/vtkModuleDependencies.h"
"\"${vtk_module_depends}\", ")
    endforeach ()
    file(APPEND "${CMAKE_CURRENT_BINARY_DIR}/vtkModuleDependencies.h"
"NULL };
")
    set(last_module ${vtk_module})
  endif ()
endforeach ()
file(APPEND "${CMAKE_CURRENT_BINARY_DIR}/vtkModules.h"
"  { NULL, NULL, NULL, false }
};
")

configure_file(
  "${CMAKE_CURRENT_SOURCE_DIR}/paraview-config.cxx.in"
  "${CMAKE_CURRENT_BINARY_DIR}/paraview-config.cxx"
  @ONLY)
pv_add_executable(paraview-config
  "${CMAKE_CURRENT_BINARY_DIR}/paraview-config.cxx")
target_link_libraries(paraview-config
  vtksys)

if (NOT TARGET vtkPVServerManagerApplication)
  message(STATUS "vtkPVServerManagerApplication module is not enabled. "
    "Command line executables will not be built.")
  return()
endif()

vtk_module_dep_includes(vtkPVServerManagerApplication)
include_directories(${vtkPVServerManagerApplication_DEPENDS_INCLUDE_DIRS}
                    ${vtkPVServerManagerApplication_INCLUDE_DIRS})

set(STATIC_LINK_PLUGINS)
if (NOT BUILD_SHARED_LIBS)
  set(STATIC_LINK_PLUGINS vtkPVStaticPluginsInit)
endif()
if (PARAVIEW_USE_STATIC_NUMPY)
  find_library(UTIL_LIB util)

  set(extra_python_libs)
  foreach (lib "${UTIL_LIB}")
    if (lib)
      list(APPEND extra_python_libs
        "${lib}")
    endif ()
  endforeach ()

  find_library(BLAS_LIB blas)
  find_library(GSL_LIB gsl)
  find_library(GSLCBLAS_LIB gslcblas)
  find_library(LAPACK_LIB lapack)

  set(extra_numpy_libs)
  foreach (libvar BLAS_LIB GSL_LIB GSLCBLAS_LIB LAPACK_LIB)
    if (${libvar})
      list(APPEND extra_numpy_libs
        "${${libvar}}")
      add_definitions(-DHAVE_NUMPY_${libvar})
    endif ()
  endforeach ()
  add_definitions(-DHAVE_NUMPY_STATIC)

  list(APPEND STATIC_LINK_PLUGINS
    ${extra_python_libs} "${PYTHON_LIBRARY}"
    ${extra_numpy_libs} "${STATIC_NUMPY_LIBRARY}")
endif()


# Cray ATP support
set(PARAVIEW_USE_ATP OFF CACHE BOOL
  "Link to Cray ATP library to enable debug features on Cray Systems")
mark_as_advanced(PARAVIEW_USE_ATP)
if (PARAVIEW_USE_ATP)
  find_package(ATP)
endif()
foreach (name pvserver pvdataserver pvrenderserver)
  pv_add_executable(${name} ${name}.cxx)
  target_link_libraries(${name}
    vtkPVServerManagerApplication
    ${STATIC_LINK_PLUGINS})
  if (ATP_FOUND)
    target_link_libraries(${name} ${ATP_LIBRARIES})
    set_target_properties(${name} PROPERTIES LINK_FLAGS "${ATP_LINK_FLAGS}")
  endif()
endforeach()

if (PARAVIEW_ENABLE_PYTHON)
  foreach (name pvbatch pvpython)
    pv_add_executable(${name} ${name}.cxx)
    target_link_libraries(${name}
      vtkPVServerManagerApplication
      vtkUtilitiesPythonInitializer
      ${VTK_PYTHON_LIBRARIES}
      ${STATIC_LINK_PLUGINS})
    if (ATP_FOUND)
      target_link_libraries(${name} ${ATP_LIBRARIES})
      set_target_properties(${name} PROPERTIES LINK_FLAGS "${ATP_LINK_FLAGS}")
    endif()
    add_dependencies(${name} paraview_python_package)
  endforeach()

  # add python module dependencies to the server-executables for static builds.
  foreach (name pvserver pvdataserver pvrenderserver)
    target_link_libraries(${name}
        vtkUtilitiesPythonInitializer)
  endforeach()

endif()
